#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>

struct sigaction act, oact;
void handler(int signal)
{
     while(1){
        printf("get a signal: %d\n", signal);
        sleep(1);

     }

}

int main()
{
    memset(&act, 0, sizeof(act));
//    memset(&oact, 0, sizeof(oact));
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, 3);
    sigaction(2, &act, NULL);
    while(1){
        printf("hello linux!\n");
        sleep(1);
    }
    return 0;
}


//#include <stdio.h>
//#include <unistd.h>
//#include <stdlib.h>
//#include <signal.h>
// 
//int main()
//{
//    struct sigaction newact,oldact;
// 
//    /* 设置信号忽略 */
//    newact.sa_handler = SIG_IGN; //这个地方也可以是函数
//    sigemptyset(&newact.sa_mask);
//    newact.sa_flags = 0;
//    int count = 0;
//    pid_t pid = 0;
// 
//    sigaction(SIGINT,&newact,&oldact);//原来的备份到oldact里面
// 
//    pid = fork();
//    if(pid == 0)
//    {
//        while(1)
//        {
//            printf("I'm child gaga.......\n");
//            sleep(1);
//        }
//        return 0;
//    }
// 
//    while(1)
//    {
//        if(count++ > 3)
//        {
//            sigaction(SIGINT,&oldact,NULL);  //备份回来
//            printf("pid = %d\n",pid);
//            kill(pid,SIGKILL); //父进程发信号，来杀死子进程
//        }
// 
//        printf("I am father .......... hahaha\n");
//        sleep(1);
//    }
// 
//    return 0;
//}



































































//int main()
//{
//    //虽然sigset_t是一个位图结构，但是不同的操作系统实现时不一样的；
//    //不能直接让用户直接修改该变量
//    
//    //创建两个位图
//    sigset_t inset, outset;
//    //将两个位图清空
//    sigemptyset(&inset);
//    sigemptyset(&outset);
//    
//    //将2号信号屏蔽，可以将其添加到inset位图中
//    sigaddset(&inset, 2);
//    sigprocmask(SIG_SETMASK, &inset, &outset);
//
//    while(1){
//        printf("hello linux!\n");
//        sleep(1);
//    }
//    return 0;
//}





//void show_pending(sigset_t *pending)
//{
//    printf("current procecc pending: ");
//	  int i = 1;
//	  for (i = 1; i <= 31; i++){
//		    if (sigismember(pending, i)){//判断一个信号是否在这个集合中
//			      printf("1");
//		    }
//		    else{
//			      printf("0");
//		    }
//	  }
//	  printf("\n");
//}
//
//void handler(int signal)
//{
//    printf("%d号信号被递达了，已经处理完成了\n", signal);
//}
//
//int main()
//{
//    signal(2, handler);
//    //创建两个阻塞信号集（block位图），并初始化为空
//	  sigset_t inset, outset;
//	  sigemptyset(&inset);
//	  sigemptyset(&outset);
//
//	  sigaddset(&inset, 2); //添加2号信号到inset信号集中
//	  sigprocmask(SIG_SETMASK, &inset, &outset); //直接阻塞2号信号
//
//	  sigset_t pending;//创建一个未决信号集（pending位图）
//	  sigemptyset(&pending);//初始化为空
//    
//    int count = 0;
//
//	  while (1){
//		    sigpending(&pending); //获取pending位图
//		    show_pending(&pending); //打印pending位图（1表示未决）
//		    sleep(1);
//        count++;
//        if(count == 10){
//            sigprocmask(SIG_SETMASK, &outset, NULL);
//            printf("恢复对2号信号，可以被递达了\n");
//        }
//	  }
//	  return 0;
//}
//
